home *** CD-ROM | disk | FTP | other *** search
/ WINMX Assorted Textfiles / Ebooks.tar / Text - Tech - Hacking - How To Spoof Your IP - IP Spoofing Demystified (TXT).rar / IP-spoofing Demystified.txt
Text File  |  2000-07-17  |  25KB  |  559 lines

  1.                              ==Phrack Magazine==
  2.  
  3.              Volume Seven, Issue Forty-Eight, File 14 of 18
  4.  
  5.  
  6.              [ IP-spoofing Demystified ]
  7.               (Trust-Relationship Exploitation)
  8.  
  9.  
  10.             by daemon9 / route / infinity
  11.                  for Phrack Magazine
  12.               June 1996 Guild Productions, kid
  13.  
  14.                comments to route@infonexus.com
  15.  
  16.  
  17.         The purpose of this paper is to explain IP-spoofing to the
  18. masses.  It assumes little more than a working knowledge of Unix and
  19. TCP/IP.  Oh, and that yur not a moron...
  20.         IP-spoofing is complex technical attack that is made up of
  21. several components.  (In actuality, IP-spoofing is not the attack, but
  22. a step in the attack.  The attack is actually trust-relationship
  23. exploitation.  However, in this paper,  IP-spoofing will refer to the
  24. whole attack.)  In this paper, I will explain the attack in detail,
  25. including the relevant operating system and networking information.
  26.  
  27.  
  28.                 [SECTION I.  BACKGROUND INFORMATION]
  29.  
  30.  
  31.         --[ The Players ]--
  32.  
  33.  
  34.         A:      Target host
  35.         B:      Trusted host
  36.         X:      Unreachable host
  37.         Z:      Attacking host
  38.         (1)2:   Host 1 masquerading as host 2
  39.  
  40.  
  41.         --[ The Figures ]--
  42.  
  43.  
  44.         There are several figures in the paper and they are to be
  45. interpreted as per the following example:
  46.  
  47. ick   host a      control     host b
  48. 1       A       ---SYN--->      B
  49.  
  50. tick:   A tick of time.  There is no distinction made as to *how*
  51. much time passes between ticks, just that time passes.  It's generally
  52. not a great deal.
  53. host a: A machine particpating in a TCP-based conversation.
  54. control: This field shows any relevant control bits set in the TCP
  55. header and the direction the data is flowing
  56. host b: A machine particpating in a TCP-based conversation.
  57.  
  58. In this case, at the first refrenced point in time host a is sending
  59. a TCP segment to host b with the SYN bit on.  Unless stated, we are
  60. generally not concerned with the data portion of the TCP segment.
  61.  
  62.  
  63.         --[ Trust Relationships ]--
  64.  
  65.  
  66.         In the Unix world, trust can be given all too easily.  Say you
  67. have an account on machine A, and on machine B.  To facilitate going
  68. betwixt the two with a minimum amount of hassle, you want to setup a
  69. full-duplex trust relationship between them.  In your home directory
  70. at A you create a .rhosts file: `echo "B username" > ~/.rhosts` In
  71. your home directory at B you create a .rhosts file: `echo "A username"
  72. > ~/.rhosts` (Alternately, root can setup similar rules in
  73. /etc/hosts.equiv, the difference being that the rules are hostwide,
  74. rather than just on an individual basis.)  Now, you can use any of the
  75. r* commands without that annoying hassle of password authentication.
  76. These commands will allow address-based authentication, which will
  77. grant or deny access based off of the IP address of the service
  78. requestor.
  79.  
  80.  
  81.         --[ Rlogin ]--
  82.  
  83.  
  84.         Rlogin is a simple client-server based protocol that uses TCP
  85. as it's transport.  Rlogin allows a user to login remotely from one
  86. host to another, and, if the target machine trusts the other, rlogin
  87. will allow the convienience of not prompting for a password.  It will
  88. instead have authenticated the client via the source IP address.  So,
  89. from our example above, we can use rlogin to remotely login to A from
  90. B (or vice-versa) and not be prompted for a password.
  91.  
  92.  
  93.         --[ Internet Protocol ]--
  94.  
  95.  
  96.         IP is the connectionless, unreliable network protocol in the
  97. TCP/IP suite.  It has two 32-bit header fields to hold address
  98. information.  IP is also the busiest of all the TCP/IP protocols as
  99. almost all TCP/IP traffic is encapsulated in IP datagrams.  IP's job
  100. is to route packets around the network.  It provides no mechanism for
  101. reliability or accountability, for that, it relies on the upper
  102. layers.  IP simply sends out datagrams and hopes they make it intact.
  103. If they don't, IP can try to send an ICMP error message back to the
  104. source, however this packet can get lost as well.  (ICMP is Internet
  105. Control Message Protocol and it is used to relay network conditions
  106. and different errors to IP and the other layers.)  IP has no means to
  107. guarantee delivery.  Since IP is connectionless, it does not maintain
  108. any connection state information.  Each IP datagram is sent out without
  109. regard to the last one or the next one.  This, along with the fact that
  110. it is trivial to modify the IP stack to allow an arbitrarily choosen IP
  111. address in the source (and destination) fields make IP easily subvertable.
  112.  
  113.  
  114.         --[ Transmission Control Protocol ]--
  115.  
  116.  
  117.         TCP is the connection-oriented, reliable transport protocol
  118. in the TCP/IP suite.  Connection-oriented simply means that the two
  119. hosts participating in a discussion must first establish a connection
  120. before data may change hands.  Reliability is provided in a number of
  121. ways but the only two we are concerned with are data sequencing and
  122. acknowledgement.  TCP assigns sequence numbers to every segment and
  123. acknowledges any and all data segments recieved from the other end.
  124. (ACK's consume a sequence number, but are not themselves ACK'd.)
  125. This reliability makes TCP harder to fool than IP.
  126.  
  127.  
  128.         --[ Sequence Numbers, Acknowledgements and other flags ]--
  129.  
  130.  
  131.         Since TCP is reliable, it must be able to recover from
  132. lost, duplicated, or out-of-order data.  By assigning a sequence
  133. number to every byte transfered, and requiring an acknowledgement from
  134. the other end upon receipt, TCP can guarantee reliable delivery.  The
  135. receiving end uses the sequence numbers to ensure proper ordering of
  136. the data and to eliminate duplicate data bytes.
  137.         TCP sequence numbers can simply be thought of as 32-bit
  138. counters.  They range from 0 to 4,294,967,295.  Every byte of
  139. data exchanged across a TCP connection (along with certain flags)
  140. is sequenced.  The sequence number field in the TCP header will
  141. contain the sequence number of the *first* byte of data in the
  142. TCP segment.  The acknowledgement number field in the TCP header
  143. holds the value of next *expected* sequence number, and also
  144. acknowledges *all* data up through this ACK number minus one.
  145.         TCP uses the concept of window advertisement for flow
  146. control.  It uses a sliding window to tell the other end how much
  147. data it can buffer.  Since the window size is 16-bits a receiving TCP
  148. can advertise up to a maximum of 65535 bytes.  Window advertisement
  149. can be thought of an advertisment from one TCP to the other of how
  150. high acceptable sequence numbers can be.
  151.         Other TCP header flags of note are RST (reset), PSH (push)
  152. and FIN (finish).  If a RST is received, the connection is
  153. immediately torn down.  RSTs are normally sent when one end
  154. receives a segment that just doesn't jive with current connection
  155. (we will encounter an example below).  The PSH flag tells the
  156. reciever to pass all the data is has queued to the aplication, as
  157. soon as possible.  The FIN flag is the way an application begins a
  158. graceful close of a connection (connection termination is a 4-way
  159. process). When one end recieves a FIN, it ACKs it, and does not
  160. expect to receive any more data (sending is still possible, however).
  161.  
  162.  
  163.         --[ TCP Connection Establishment ]--
  164.  
  165.  
  166.         In order to exchange data using TCP, hosts must establish a
  167. a connection.  TCP establishes a connection in a 3 step process called
  168. the 3-way handshake.  If machine A is running an rlogin client and
  169. wishes to conect to an rlogin daemon on machine B, the process is as
  170. follows:
  171.  
  172.                 fig(1)
  173.  
  174. 1       A       ---SYN--->      B
  175.  
  176. 2       A    <---SYN/ACK---     B
  177.  
  178. 3       A       ---ACK--->      B
  179.  
  180.  
  181. At (1) the client is telling the server that it wants a connection.
  182. This is the SYN flag's only purpose.  The client is telling the
  183. server that the sequence number field is valid, and should be checked.
  184. The client will set the sequence number field in the TCP header to
  185. it's ISN (initial sequence number).  The server, upon receiving this
  186. segment (2) will respond with it's own ISN (therefore the SYN flag is
  187. on) and an ACKnowledgement of the clients first segment (which is the
  188. client's ISN+1).  The client then ACK's the server's ISN (3).  Now,
  189. data transfer may take place.
  190.  
  191.  
  192.         --[ The ISN and Sequence Number Incrementation ]--
  193.  
  194.  
  195.         It is important to understand how sequence numbers are
  196. initially choosen, and how they change with respect to time.  The
  197. initial sequence number when a host is bootstraped is initialized
  198. to 1. (TCP actually calls this variable 'tcp_iss' as it is the initial
  199. *send* sequence number.  The other sequence number variable,
  200. 'tcp_irs' is the initial *receive* sequence number and is learned
  201. during the 3-way connection establishment.  We are not going to worry
  202. about the distinction.)  This practice is wrong, and is acknowledged
  203. as so in a comment the tcp_init() function where it appears.  The ISN
  204. is incremented by 128,000 every second, which causes the 32-bit ISN
  205. counter to wrap every 9.32 hours if no connections occur.  However,
  206. each time a connect() is issued, the counter is incremented by
  207. 64,000.
  208.         One important reason behind this predictibility is to
  209. minimize the chance that data from an older stale incarnation
  210. (that is, from the same 4-tuple of the local and remote
  211. IP-addresses TCP ports) of the current connection could arrive
  212. and foul things up.  The concept of the 2MSL wait time applies
  213. here, but is beyond the scope of this paper.  If sequence
  214. numbers were choosen at random when a connection arrived, no
  215. guarantees could be made that the sequence numbers would be different
  216. from a previous incarnation.  If some data that was stuck in a
  217. routing loop somewhere finally freed itself and wandered into the new
  218. incarnation of it's old connection, it could really foul things up.
  219.  
  220.  
  221.         --[ Ports ]--
  222.  
  223.  
  224.         To grant simultaneous access to the TCP module, TCP provides
  225. a user interface called a port.  Ports are used by the kernel to
  226. identify network processes.  These are strictly transport layer
  227. entities (that is to say that IP could care less about them).
  228. Together with an IP address, a TCP port provides provides an endpoint
  229. for network communications.  In fact, at any given moment *all*
  230. Internet connections can be described by 4 numbers: the source IP
  231. address and source port and the destination IP address and destination
  232. port.  Servers are bound to 'well-known' ports so that they may be
  233. located on a standard port on different systems.  For example, the
  234. rlogin daemon sits on TCP port 513.
  235.  
  236.  
  237.                 [SECTION II.  THE ATTACK]
  238.  
  239.  
  240.         ...The devil finds work for idle hands....
  241.  
  242.  
  243.         --[ Briefly... ]--
  244.  
  245.  
  246.         IP-spoofing consists of several steps, which I will
  247. briefly outline here, then explain in detail.  First, the target host
  248. is choosen.  Next, a pattern of trust is discovered, along with a
  249. trusted host.  The trusted host is then disabled, and the target's TCP
  250. sequence numbers are sampled.  The trusted host is impersonated, the
  251. sequence numbers guessed, and a connection attempt is made to a
  252. service that only requires address-based authentication.  If
  253. successful, the attacker executes a simple command to leave a
  254. backdoor.
  255.  
  256.  
  257.         --[ Needful Things ]--
  258.  
  259.  
  260.         There are a couple of things one needs to wage this attack:
  261.  
  262.                 (1) brain, mind, or other thinking device
  263.                 (1) target host
  264.                 (1) trusted host
  265.                 (1) attacking host (with root access)
  266.                 (1) IP-spoofing software
  267.  
  268. Generally the attack is made from the root account on the attacking
  269. host against the root account on the target.  If the attacker is
  270. going to all this trouble, it would be stupid not to go for root.
  271. (Since root access is needed to wage the attack, this should not
  272. be an issue.)
  273.  
  274.  
  275.         --[ IP-Spoofing is a 'Blind Attack' ]--
  276.  
  277.  
  278.         One often overlooked, but critical factor in IP-spoofing
  279. is the fact that the attack is blind.  The attacker is going to be
  280. taking over the identity of a trusted host in order to subvert the
  281. security of the target host.  The trusted host is disabled using the
  282. method described below.  As far as the target knows, it is carrying on
  283. a conversation with a trusted pal.  In reality, the attacker is
  284. sitting off in some dark corner of the Internet, forging packets
  285. puportedly from this trusted host while it is locked up in a denial
  286. of service battle.  The IP datagrams sent with the forged IP-address
  287. reach the target fine (recall that IP is a connectionless-oriented
  288. protocol--  each datagram is sent without regard for the other end)
  289. but the datagrams the target sends back (destined for the trusted
  290. host) end up in the bit-bucket.  The attacker never sees them.  The
  291. intervening routers know where the datagrams are supposed to go.  They
  292. are supposed to go the trusted host.  As far as the network layer is
  293. concerned, this is where they originally came from, and this is where
  294. responses should go.  Of course once the datagrams are routed there,
  295. and the information is demultiplexed up the protocol stack, and
  296. reaches TCP, it is discarded (the trusted host's TCP cannot respond--
  297. see below).  So the attacker has to be smart and *know* what was sent,
  298. and *know* what reponse the server is looking for.  The attacker
  299. cannot see what the target host sends, but she can *predict* what it
  300. will send; that coupled with the knowledge of what it *will* send,
  301. allows the attacker to work around this blindness.
  302.  
  303.  
  304.         --[ Patterns of Trust ]--
  305.  
  306.  
  307.         After a target is choosen the attacker must determine the
  308. patterns of trust (for the sake of argument, we are going to assume
  309. the target host *does* in fact trust somebody.  If it didn't, the
  310. attack would end here).  Figuring out who a host trusts may or may
  311. not be easy.  A 'showmount -e' may show where filesystems are
  312. exported, and rpcinfo can give out valuable information as well.
  313. If enough background information is known about the host, it should
  314. not be too difficult.  If all else fails, trying neighboring IP
  315. addresses in a brute force effort may be a viable option.
  316.  
  317.  
  318.         --[ Trusted Host Disabling Using the Flood of Sins ]--
  319.  
  320.  
  321.         Once the trusted host is found, it must be disabled.  Since
  322. the attacker is going to impersonate it, she must make sure this host
  323. cannot receive any network traffic and foul things up.  There are
  324. many ways of doing this, the one I am going to discuss is TCP SYN
  325. flooding.
  326.         A TCP connection is initiated with a client issuing a
  327. request to a server with the SYN flag on in the TCP header.  Normally
  328. the server will issue a SYN/ACK back to the client identified by the
  329. 32-bit source address in the IP header.  The client will then send an
  330. ACK to the server (as we saw in figure 1 above) and data transfer
  331. can commence.  There is an upper limit of how many concurrent SYN
  332. requests TCP can process for a given socket, however.  This limit
  333. is called the backlog, and it is the length of the queue where
  334. incoming (as yet incomplete) connections are kept.  This queue limit
  335. applies to both the number of imcomplete connections (the 3-way
  336. handshake is not complete) and the number of completed connections
  337. that have not been pulled from the queue by the application by way of
  338. the accept() system call.  If this backlog limit is reached, TCP will
  339. silently discard all incoming SYN requests until the pending
  340. connections can be dealt with.  Therein lies the attack.
  341.         The attacking host sends several SYN requests to the TCP port
  342. she desires disabled.  The attacking host also must make sure that
  343. the source IP-address is spoofed to be that of another, currently
  344. unreachable host (the target TCP will be sending it's response to
  345. this address.  (IP may inform TCP that the host is unreachable,
  346. but TCP considers these errors to be transient and leaves the
  347. resolution of them up to IP (reroute the packets, etc) effectively
  348. ignoring them.)  The IP-address must be unreachable because the
  349. attacker does not want any host to recieve the SYN/ACKs that will be
  350. coming from the target TCP (this would result in a RST being sent to
  351. the target TCP, which would foil our attack).  The process is as
  352. follows:
  353.  
  354.                 fig(2)
  355.  
  356. 1       Z(x)    ---SYN--->      B
  357.  
  358.         Z(x)    ---SYN--->      B
  359.  
  360.         Z(x)    ---SYN--->      B
  361.  
  362.         Z(x)    ---SYN--->      B
  363.  
  364.         Z(x)    ---SYN--->      B
  365.  
  366.                 ...
  367.  
  368. 2       X    <---SYN/ACK---     B
  369.  
  370.         X    <---SYN/ACK---     B
  371.  
  372.                 ...
  373.  
  374. 3       X      <---RST---       B
  375.  
  376.  
  377. At (1) the attacking host sends a multitude of SYN requests to the
  378. target (remember the target in this phase of the attack is the
  379. trusted host) to fill it's backlog queue with pending connections.
  380. (2) The target responds with SYN/ACKs to what it believes is the
  381. source of the incoming SYNs.  During this time all further requests
  382. to this TCP port will be ignored.
  383.         Different TCP implementations have different backlog sizes.
  384. BSD generally has a backlog of 5 (Linux has a backlog of 6).  There
  385. is also a 'grace' margin of 3/2.  That is, TCP will allow up to
  386. backlog*3/2+1 connections.  This will allow a socket one connection
  387. even if it calls listen with a backlog of 0.
  388.  
  389.         AuthNote: [For a much more in-depth treatment of TCP SYN
  390. flooding, see my definitive paper on the subject.  It covers the
  391. whole process in detail, in both theory, and practice.  There is
  392. robust working code, a statistical analysis, and a legnthy paper.
  393. Look for it in issue 49 of Phrack. -daemon9 6/96]
  394.  
  395.  
  396.         --[ Sequence Number Sampling and Prediction ]--
  397.  
  398.  
  399.         Now the attacker needs to get an idea of where in the 32-bit
  400. sequence number space the target's TCP is.  The attacker connects to
  401. a TCP port on the target (SMTP is a good choice) just prior to launching
  402. the attack and completes the three-way handshake.  The process is
  403. exactly the same as fig(1), except that the attacker will save the
  404. value of the ISN sent by the target host.  Often times, this process is
  405. repeated several times and the final ISN sent is stored.  The attacker
  406. needs to get an idea of what the RTT (round-trip time) from the target
  407. to her host is like.  (The process can be repeated several times, and an
  408. average of the RTT's is calculated.)  The RTT is necessary in being
  409. able to accuratly predict the next ISN.  The attacker has the baseline
  410. (the last ISN sent) and knows how the sequence numbers are incremented
  411. (128,000/second and 64,000 per connect) and now has a good idea of
  412. how long it will take an IP datagram to travel across the Internet to
  413. reach the target (approximately half the RTT, as most times the
  414. routes are symmetrical).  After the attacker has this information, she
  415. immediately proceeds to the next phase of the attack (if another TCP
  416. connection were to arrive on any port of the target before the
  417. attacker was able to continue the attack, the ISN predicted by the
  418. attacker would be off by 64,000 of what was predicted).
  419.         When the spoofed segment makes it's way to the target,
  420. several different things may happen depending on the accuracy of
  421. the attacker's prediction:
  422. - If the sequence number is EXACTly where the receiving TCP expects
  423. it to be, the incoming data will be placed on the next available
  424. position in the receive buffer.
  425. - If the sequence number is LESS than the expected value the data
  426. byte is considered a retransmission, and is discarded.
  427. - If the sequence number is GREATER than the expected value but
  428. still within the bounds of the receive window, the data byte is
  429. considered to be a future byte, and is held by TCP, pending the
  430. arrival of the other missing bytes.  If a segment arrives with a
  431. sequence number GREATER than the expected value and NOT within the
  432. bounds of the receive window the segment is dropped, and TCP will
  433. send a segment back with the *expected* sequence number.
  434.  
  435.  
  436.         --[ Subversion... ]--
  437.  
  438.  
  439.         Here is where the main thrust of the attack begins:
  440.  
  441.                 fig(3)
  442.  
  443. 1       Z(b)    ---SYN--->      A
  444.  
  445. 2       B     <---SYN/ACK---    A
  446.  
  447. 3       Z(b)    ---ACK--->      A
  448.  
  449. 4       Z(b)    ---PSH--->      A
  450.  
  451.                 [...]
  452.  
  453.  
  454. The attacking host spoofs her IP address to be that of the trusted
  455. host (which should still be in the death-throes of the D.O.S. attack)
  456. and sends it's connection request to port 513 on the target (1).  At
  457. (2), the target responds to the spoofed connection request with a
  458. SYN/ACK, which will make it's way to the trusted host (which, if it
  459. *could* process the incoming TCP segment, it would consider it an
  460. error, and immediately send a RST to the target).  If everything goes
  461. according to plan, the SYN/ACK will be dropped by the gagged trusted
  462. host.  After (1), the attacker must back off for a bit to give the
  463. target ample time to send the SYN/ACK (the attacker cannot see this
  464. segment).  Then, at (3) the attacker sends an ACK to the target with
  465. the predicted sequence number (plus one, because we're ACKing it).
  466. If the attacker is correct in her prediction, the target will accept
  467. the ACK.  The target is compromised and data transfer can
  468. commence (4).
  469.         Generally, after compromise, the attacker will insert a
  470. backdoor into the system that will allow a simpler way of intrusion.
  471. (Often a `cat + + >> ~/.rhosts` is done.  This is a good idea for
  472. several reasons: it is quick, allows for simple re-entry, and is not
  473. interactive.  Remember the attacker cannot see any traffic coming from
  474. the target, so any reponses are sent off into oblivion.)
  475.  
  476.  
  477.         --[ Why it Works ]--
  478.  
  479.  
  480.         IP-Spoofing works because trusted services only rely on
  481. network address based authentication.  Since IP is easily duped,
  482. address forgery is not difficult.  The hardest part of the attck is
  483. in the sequence number prediction, because that is where the guesswork
  484. comes into play.  Reduce unknowns and guesswork to a minimum, and
  485. the attack has a better chance of suceeding.  Even a machine that
  486. wraps all it's incoming TCP bound connections with Wietse Venema's TCP
  487. wrappers, is still vulnerable to the attack.  TCP wrappers rely on a
  488. hostname or an IP address for authentication...
  489.  
  490.  
  491.                 [SECTION III. PREVENTITIVE MEASURES]
  492.  
  493.  
  494.         ...A stich in time, saves nine...
  495.  
  496.  
  497.         --[ Be Un-trusting and Un-trustworthy ]--
  498.  
  499.  
  500.         One easy solution to prevent this attack is not to rely
  501. on address-based authentication.  Disable all the r* commands,
  502. remove all .rhosts files and empty out the /etc/hosts.equiv file.
  503. This will force all users to use other means of remote access
  504. (telnet, ssh, skey, etc).
  505.  
  506.  
  507.         --[ Packet Filtering ]--
  508.  
  509.  
  510.         If your site has a direct connect to the Internet, you
  511. can use your router to help you out.  First make sure only hosts
  512. on your internal LAN can particpate in trust-relationships (no
  513. internal host should trust a host outside the LAN).  Then simply
  514. filter out *all* traffic from the outside (the Internet) that
  515. puports to come from the inside (the LAN).
  516.  
  517.  
  518.         --[ Cryptographic Methods ]--
  519.  
  520.  
  521.         An obvious method to deter IP-spoofing is to require
  522. all network traffic to be encrypted and/or authenticated.  While
  523. several solutions exist, it will be a while before such measures are
  524. deployed as defacto standards.
  525.  
  526.  
  527.         --[ Initial Sequence Number Randomizing ]--
  528.  
  529.  
  530.         Since the sequence numbers are not choosen randomly (or
  531. incremented randomly) this attack works.  Bellovin describes a
  532. fix for TCP that involves partitioning the sequence number space.
  533. Each connection would have it's own seperate sequence number space.
  534. The sequence numbers would still be incremented as before, however,
  535. there would be no obvious or implied relationship between the
  536. numbering in these spaces.  Suggested is the following formula:
  537.  
  538.         ISN=M+F(localhost,localport,remotehost,remoteport)
  539.  
  540. Where M is the 4 microsecond timer and F is a cryptographic hash.
  541. F must not be computable from the outside or the attacker could
  542. still guess sequence numbers.  Bellovin suggests F be a hash of
  543. the connection-id and a secret vector (a random number, or a host
  544. related secret combined with the machine's boot time).
  545.  
  546.  
  547.                 [SECTION IV.  SOURCES]
  548.  
  549.  
  550.         -Books:         TCP/IP Illustrated vols. I, II & III
  551.         -RFCs:          793, 1825, 1948
  552.         -People:        Richard W. Stevens, and the users of the
  553.                         Information Nexus for proofreading
  554.         -Sourcecode:    rbone, mendax, SYNflood
  555.  
  556.  
  557. This paper made possible by a grant from the Guild Corporation.
  558.  
  559.